Pagina iniziale | Navigazione |
Google

CPU

Una CPU (acronimo di Central Processing Unit, detta comunemente processore) è l'implementazione fisica di uno dei due componenti della macchina di Turing (l'altro è la memoria).

Compito della CPU è quello di leggere le istruzioni e i dati dalla memoria ed eseguire le istruzioni; il risultato della esecuzione di una istruzione dipende dal dato su cui opera e dallo stato interno della CPU stessa, che tiene traccia delle passate operazioni.

Qualunque CPU contiene:

  • dei registri, speciali locazioni di memoria interne alla CPU, molto veloci, a cui è possibile accedere molto più rapidamente che alla memoria: il valore dei registri è lo stato in cui si trova attualmente la CPU. Due registri sempre presenti sono:
    • il registro IP (Instruction Pointer), che contiene l'indirizzo in memoria della prossima istruzione da eseguire;
    • il registro dei flag: questo registro non contiene valori numerici convenzionali, ma è piuttosto un insieme di bit, detti appunto flag, che segnalano stati particolari della CPU e alcune informazioni sul risultato dell'ultima operazione eseguita. I flag più importanti sono:
      • Zero: vale 1 se l'ultima operazione ha avuto risultato zero, altrimenti vale 0.
      • Carry: vale 1 se l'ultima operazione ha ecceduto la capacità del registro che contiene il risultato, altrimenti vale 0 (esempio: per un registro a 8 bit, che può rappresentare solo numeri fino a 255, la somma 178+250 darebbe come risultato 172 e il carry a 1).
      • Interrupt: se a questo flag viene assegnato valore 1, la CPU smette di rispondere alle richieste di servizio esterne delle periferiche (i segnali delle linee IRQ) finchè non viene ripristinato al valore 0, o finchè non arriva dall'esterno un segnale di RESET.
  • una ALU (Unità Aritmetico-Logica) che si occupa di eseguire le operazioni logiche e aritmetiche;
  • una Unità di Controllo che legge dalla memoria le istruzioni, se occorre legge anche i dati per l'istruzione letta, esegue l'istruzione e memorizza il risultato se c'è, scrivendolo in memoria o in un registro della CPU.

Le istruzioni di una CPU sono semplicemente dei numeri, detti opcode o codici operativi: in base al loro valore l'unità di controllo intraprende delle azioni predefinite, come per esempio leggere la successiva locazione di memoria per caricare un dato, oppure attivare la ALU per eseguire un calcolo, oppure scrivere il contenuto di un registro in una certa locazione di memoria o in un altro registro, oppure una combinazione di queste. Una CPU è un circuito digitale sincrono: vale a dire che il suo stato cambia ogni volta che riceve un impulso da un segnale di sincronismo detto CLOCK: quindi il tempo di esecuzione di una istruzione si misura in cicli di clock, cioè in quanti impulsi di clock sono necessari perchè la CPU la completi.

Una caratteristica importante dell'insieme (set) delle istruzioni di una CPU è la sua ortogonalità: vale a dire, il fatto che ogni istruzione che usi i registri possa usarli tutti indifferentemente (tranne quelli "speciali" come l'IP) e che nessun registro sia in qualche modo privilegiato rispetto agli altri perchè su di esso si possono compiere operazioni particolari: è stato dimostrato che un set di istruzioni ortogonali, a parità di tempo di esecuzione delle istruzioni e di numero dei registri, è più efficiente di uno non ortogonale.

= Architettura della CPU = Una generica CPU deve gestire una serie di operazioni sincronizzandole con il resto del sistema di cui fa parte: perciò è dotata, oltre all'ALU e ai registri interni, di una unità di controllo e di uno o più bus interni che si occupano di collegare registri, ALU, unità di controllo e memoria.

Negli anni 80, quando i transistor disponibili su un solo chip erano pochi, esistevano due diverse scuole di pensiero su quale fosse il modo migliore di progettare una CPU: se fosse meglio usare unità di controllo molto semplici per avere molti registri (approccio RISC) o se invece non convenisse creare unità di controllo complesse capaci di sfruttare al meglio pochi registri (approccio CISC); questa disputa si è risolta a favore delle CPU RISC, ma nel frattempo il numero di transistor disponibili per i processori è aumentato tanto che ormai si può avere sia la botte piena che la moglie ubriaca: attualmente tutti i processori moderni sono CRISP, cioè implementano molti registri e hanno anche unità di controllo complesse.

All'unità di controllo interna fanno capo una serie di segnali elettrici esterni che si occupano di tenere la CPU al corrente dello stato del resto del sistema e di agire su di esso. Il tipo e il numero di segnali esterni gestiti possono variare ma alcuni, come il RESET, le linee di IRQ e il CLOCK sono sempre presenti. Altre unità che possono essere presenti in una CPU sono la MMU, Memory Management Unit, che si occupa di tradurre indirizzi di memoria virtuale in indirizzi di memoria fisica, e la FPU, Floating Point Unit che esegue operazioni matematiche su numeri in virgola mobile.

Il normale ciclo di operazioni di una CPU è il seguente: l'unità di controllo legge la locazione di memoria indicata dal registro IP, incrementa il registro IP di uno e la decodifica; se la decodifica indica che l'istruzione è più lunga di una locazione di memoria, legge anche il resto dell'istruzione e incrementa l'IP del numero di locazioni lette; esegue l'istruzione; se necessario scrive in memoria (o in altri registri) il risultato. Dopodichè torna a leggere l'indirizzo puntato da IP per caricare ed eseguire un'altra istruzione, all'infinito.

Questo ciclo elementare può essere migliorato in vari modi: per esempio, la decodifica di una istruzione può essere fatta contemporaneamente all'esecuzione della precedente e alla lettura dalla memoria della prossima (instruction prefetch) e lo stesso può essere fatto con i dati che si prevede saranno necessari alle istruzioni (data prefetch). La stessa esecuzione delle istruzioni può essere suddivisa in passi più semplici, da eseguire in stadi successivi, organizzando la unità di controllo e la ALU in stadi consecutivi, come delle catene di montaggio (pipeline): in questo modo più istruzioni possono essere eseguite "quasi contemporaneamente", ciascuna occupando ad un certo istante uno stadio diverso della pipeline.

Il problema di questo approccio sono le istruzioni di salto condizionato, cioè istruzioni che impostano il valore stesso del registro IP, ma solo se al momento della loro esecuzione sono verificate certe condizioni (particolari valori di registri). La CPU non può sapere a priori se dovrà eseguire o no il salto prima di aver eseguito quelle precedenti, così deve decidere se impostare la pipeline tenendo conto del salto o no: e in caso di previsione errata la pipeline va svuotata completamente e le istruzioni in corso di decodifica rilette da capo, perdendo molto tempo: e si perde tanto più tempo quanti più stadi ha la pipeline. Per evitare questo i processori moderni hanno unità interne il cui scopo è tentare di prevedere se, data una istruzione di salto condizionato e quelle eseguite in precedenza, il salto dovrà essere eseguito o no.

Table of contents
1 Architetture CISC
2 Architetture RISC
3 Implicito
4 Registro
5 Immediato
6 Assoluto
7 Assoluto indiretto
8 Indiretto
9 Con registro indice
10 Autorelativo

Architetture CISC

CISC è l'acronimo di Complex Instruction Set Computer: tipicamente un processore di questo tipo implementa un numero relativamente scarso (una decina) di registri di uso generale, ed ha una unità di controllo microprogrammata: vale a dire che ogni opcode viene tradotto in una serie di passi da compiere secondo un procedimento software interno all'unità di controllo stessa, che è in pratica una CPU nella CPU.

Il set di istruzioni associato a CPU di tipo CISC è molto esteso e composto in genere di alcune centinaia di codici operativi diversi che svolgono funzioni anche molto complesse, fra cui caratteristici i trasferimenti memoria-memoria, assenti nei RISC; le istruzioni hanno lunghezza variabile e possono presentarsi in formati diversi, e sono necessari due o più (a volte molti di più) cicli di clock per completare una istruzione; è possibile specificare la posizione dei dati necessari alle istruzioni usando molti metodi di indirizzamento diversi. Il ridotto numero di registri interni obbliga questi processori a scrivere in memoria ogni volta che si verifica una chiamata di funzione, che si verifica un context switch o che viene salvato un registro nello stack.

Programmare in Assembler un CPU CISC è un compito (relativamente) facile, perchè le istruzioni presenti sono più vicine a quelle dei linugaggi ad alto livello: i compilatori che generano codice per CPU CISC sono piuttosto semplici ed inoltre il codice prodotto è molto compatto e occupa poca memoria.

Architetture RISC

RISC è l'acronimo di Reduced Instruction Set Computer: questi processori hanno una unità di controllo cablata molto semplice e riservano invece molto spazio per i registri interni: una CPU RISC ha di solito da un minimo di un centinaio ad alcune migliaia di registri interni generici, organizzati in un file di registri. Il tipico set di istruzioni RISC è molto piccolo, circa sessanta o settanta istruzioni molto elementari (logiche, aritmetiche e istruzioni di trasferimento memoria-registro e registro-registro): hanno tutte lo stesso formato e la stessa lunghezza, e tutte o quasi vengono eseguite in un solo ciclo di clock. Sono presenti solo un numero ristretto di metodi di indirizzamento.

Nel caso di context-switch o di chiamata a subroutine o comunque di uso dello stack i RISC invece di accedere alla memoria di sistema usano un meccanismo chiamato register renaming, che consiste nel rinominare i registri in modo da usare per la nuova esecuzione una diversa zona del file di registri, senza dover accedere alla memoria ogni volta.

La complessità nei RISC si sposta dall'hardware al software: un compilatore che genera codice per CPU RISC deve affrontare un duro lavoro per generare codice compatto ed efficiente, che in ogni caso sarà più grande ed occuperà più memoria dell'equivalente per CISC.

=Metodi di indirizzamento= Molte istruzioni hanno bisogno di dati su cui operare: questi dati vengono recuperati dall'unità di controllo in base al loro indirizzo, che può essere specificato in vari modi, detti appunto metodi di indirizzamento: i processori RISC usano solo un sottoinsieme di questi, tipicamente gli indirizzamenti registro, immediato e indiretto.

Implicito

L'opcode di una istruzione si riferisce già ad un certo particolare dato: si tratta in genere di istruzioni speciali.

Registro

L'istruzione specifica un registro della CPU che contiene il dato necessario.

Immediato

Il dato è presente in memoria nella locazione immediatamente successiva all'istruzione: è parte integrante dell'istruzione stessa.

Assoluto

Come nel caso immediato, con la differenza che il dato contenuto nell'istruzione è l'indirizzo (il puntatore) del dato cercato e non il dato stesso.

Assoluto indiretto

L'istruzione contiene l'indirizzo dell'indirizzo del dato: la CPU deve effettuare tre accessi consecutivi alla memoria per ottenere il dato di cui ha bisogno.

Indiretto

L'istruzione specifica un registro della CPU che contiene l'indirizzo di memoria del dato necessario.

Con registro indice

L'istruzione contiene sia un indirizzo immediato che l'indicazione di un registro: la CPU carica il dato dall'indirizzo ottenuto sommando il valore immediato al valore del registro.

Autorelativo

L'istruzione contiene un dato immediato che viene sommato al valore del registro IP per ricavare l'indirizzo da cui caricare il dato necessario.


GNU Fdl - it.Wikipedia.org




Google | 

Enciclopedia |  La Divina Commedia di Dante |  Mappa | : A |  B |  C |  D |  E |  F |  G |  H |  I |  J |  K |  L |  M |  N |  O |  P |  Q |  R |  S |  T |  U |  V |  W |  X |  Y |  Z |